home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Class.h < prev    next >
C/C++ Source or Header  |  1990-12-19  |  8KB  |  244 lines

  1. #ifndef Class_First
  2. #ifdef __GNUG__
  3. #pragma once
  4. #endif
  5. #define Class_First
  6.  
  7. #include "Object.h"
  8.  
  9. enum ClassFlags {
  10.     eClassAbstract  =   BIT(eObjLast + 1),
  11.     eClassObject    =   BIT(eObjLast + 2),
  12.     eClassLast      =   eObjLast + 2
  13. };
  14.  
  15. //---- MetaDef macros ----------------------------------------------------------
  16.  
  17. #define Meta(name) (((name*)0)->isa)
  18.  
  19. #define MetaDef(name)                                           \
  20.     name(class _dummy*);                                        \
  21.     static class Class *isa;                                    \
  22.     Class *IsA();                                               \
  23.     friend char *_NAME2_(name,DeclFileName)(char *p= __FILE__)  \
  24.     { return p; }                                           \
  25.     friend int _NAME2_(name,DeclFileLine)(int i= __LINE__)      \
  26.     { return i; }                                           \
  27.     friend istream &operator>> (istream &s, name *&op)          \
  28.     { return LoadPtr(s, (Object*&)op, Meta(name)); }        \
  29.     void Members();                                             \
  30.     friend class Class *_Type(name*)                            \
  31.     { return Meta(name); }
  32.  
  33. //---- Class -------------------------------------------------------------------
  34.  
  35. class Class: public Object {
  36.     static class Class *classptr;
  37.     
  38.     Class *super;
  39.     char *className, *declFileName, *implFileName;
  40.     class ObjArray *instanceTable;
  41.     Object *proto;
  42.     int myId, size, declFileLine, implFileLine, instanceCount;
  43.     class OrdCollection* subclasses;
  44.     class Collection *methods;
  45.  
  46. friend class ClassManager;
  47.     void Reset();
  48.  
  49. public:
  50.     MetaDef(Class);
  51.     Class(char *name, int sz= 0, Object *pro= 0, char *in= 0, char *dn= 0,
  52.         int il= 0, int dl= 0, bool abstract= FALSE, int t= 0);
  53.     ~Class();
  54.  
  55.     Class *Super() const
  56.     { return super; }
  57.     Class *SetSuper();
  58.     void AddSubclass(Class*);
  59.     class Iterator *SubclassIterator();
  60.     char *Name() const
  61.     { return className; }
  62.     int Size() const
  63.     { return size; }
  64.     Object *Proto() const
  65.     { return proto; }
  66.     Object *New();
  67.     bool isKindOf(Class*);
  68.     bool IsAbstract()
  69.     { return TestFlag(eClassAbstract); }
  70.     void SavePtr(ostream&, Object*);
  71.     void InvalidatePtr(Object*);
  72.     int MakeIndex(ObjPtr p, bool *bp= 0);
  73.     Object *LoadPtr(istream&);
  74.  
  75.     //---- comparing
  76.     u_long Hash();
  77.     bool IsEqual(Object*);
  78.     int Compare(Object*);
  79.  
  80.     //---- converting
  81.     char* AsString();
  82.  
  83.     void EnumerateMembers(class AccessMembers *accessor= 0);
  84.     void EnumerateMyMembers(AccessMembers *accessor= 0);
  85.     
  86.     //---- source access
  87.     const char *GetDeclFileName()
  88.     { return declFileName; }
  89.     const char *GetImplFileName()
  90.     { return implFileName; }   
  91.     int GetImplFileLine()
  92.     { return implFileLine; }
  93.     int GetDeclFileLine()
  94.     { return declFileLine; }
  95.  
  96.     //---- input/output
  97.     ostream& DisplayOn(ostream &s);
  98.     
  99.     //---- misc
  100.     void InspectorId(char *buf, int bufSize);
  101.     Object *SomeInstance();
  102.     Object *SomeMember();
  103.     virtual void Show(char *buf, void *addr);
  104.     
  105.     //---- statistics
  106.     void AddInstance()
  107.     { instanceCount++; }
  108.     int  GetInstanceCount()
  109.     { return instanceCount; }
  110.     void ResetInstanceCount()
  111.     { instanceCount= 0; }
  112.  
  113.     //---- methods
  114.     Collection *GetMethods();
  115.     void SetMethods(Collection *col);
  116. };
  117.  
  118. //---- member access -----------------------------------------------------------
  119.  
  120. void D_F(int, ...);
  121.  
  122. //---- MetaImpl macros ---------------------------------------------------------
  123.  
  124. #define _SimpleMetaImpl(name,printname)                          \
  125.     class _NAME2_(name,Class): public Class {                    \
  126.     public:                                                      \
  127.     _NAME2_(name,Class)() : (_QUOTE_(printname), sizeof(name), 0,\
  128.         __FILE__, __FILE__, __LINE__,                        \
  129.         __LINE__, FALSE)                                     \
  130.         { }                                                  \
  131.     void Show(char *buf, void *addr);                        \
  132.     };                                                           \
  133.     static _NAME2_(name,Class) _NAME2_(name,ClassMetaImpl0);     \
  134.     Class *_NAME2_(__isa__,name)= &_NAME2_(name,ClassMetaImpl0); \
  135.     void _NAME2_(name,Class)::Show(char *buf, void *addr)
  136.  
  137. #define SimpleMetaImpl(name)      _SimpleMetaImpl(name,name)
  138.  
  139. #define _MetaImpl0(name,abstract)                                \
  140.     static Class _NAME2_(name,ClassMetaImpl0)(_QUOTE_(name), sizeof(name),  \
  141.     new name((class _dummy*)0),                                     \
  142.     __FILE__,                                                       \
  143.     _NAME2_(name,DeclFileName)(),                                   \
  144.     __LINE__,                                                       \
  145.     _NAME2_(name,DeclFileLine)(),                                   \
  146.     abstract);                                                      \
  147. name::name(class _dummy *d) : (d)                                   \
  148.     { isa= _NAME2_(name,ClassMetaImpl0).SetSuper(); }               \
  149. Class *name::IsA()                                                  \
  150.     { return &_NAME2_(name,ClassMetaImpl0); }
  151.  
  152. extern void *TheThis; 
  153.  
  154. #define MetaImpl0(name)     \
  155. _MetaImpl0(name,FALSE)      \
  156. void name::Members() { } 
  157.  
  158. #define MetaImpl(name,list) \
  159. _MetaImpl0(name,FALSE)      \
  160. void name::Members() { TheThis= this; D_F list; }
  161.  
  162. #define AbstractMetaImpl0(name) \
  163. _MetaImpl0(name,TRUE)       \
  164. void name::Members() { }
  165.  
  166. #define AbstractMetaImpl(name,list) \
  167. _MetaImpl0(name,TRUE)       \
  168. void name::Members() { TheThis= this; D_F list; }
  169.  
  170. //---- type specifiers for metaclass macros ------------------------------------
  171.  
  172. extern int gDebug;
  173.  
  174. #define _offset(in) (u_long)&in
  175. #define _aoffset(in) (u_long)in
  176. #define TC(in,cast) 'A', _QUOTE_(in), _Type((cast*)&in),  _offset(in)
  177.  
  178. #define T(in)       'A', _QUOTE_(in), _Type(&in),  _offset(in)
  179. #define TE(in)      TC(in,int)
  180. #define TB(in)      TC(in,_bool)
  181. #define TX(in)      TC(in,_flags)
  182.  
  183. /* #define TT(in,en)   'A', _QUOTE_(in), _NAME2_(__isa__,en), _offset(in) */
  184. #define TP(in)      'P', _QUOTE_(in), _Type(in),   _offset(in)
  185. #define TV(in,len)  'B', _QUOTE_(in), _Type(in),   _offset(in),    _offset(len)
  186. #define TA(in,len)  'D', _QUOTE_(in), _Type(in),   _aoffset(in),   len
  187.  
  188. #ifdef __GNUG__ // Thanks to fcolin@cenaath.cena.dgac.fr
  189. #   define TPP(in)     'p', #in, _Type((typeof(*in))in),  _offset(in)
  190. #   define TVP(in,len) 'b', #in, _Type((typeof(*in))in),  _offset(in), _offset(len)
  191. #   define TAP(in,len) 'd', #in, _Type((typeof(*in))in),_aoffset(in), len
  192. #   define TSS(in)     'D', #in, _Type((typeof(*in))*in),  _offset(in), -1
  193. #else
  194. #   define TPP(in)     'p', _QUOTE_(in), _Type(*in),  _offset(in)
  195. #   define TVP(in,len) 'b', _QUOTE_(in), _Type(*in),  _offset(in), _offset(len)
  196. #   define TAP(in,len) 'd', _QUOTE_(in), _Type(in[0]),_aoffset(in), len
  197. #   define TSS(in)     'D', _QUOTE_(in), _Type(*in),  _offset(in), -1
  198. #endif
  199.  
  200. #define I_C(in)     T(in)
  201. #define I_S(in)     T(in)
  202. #define I_I(in)     T(in)
  203. #define I_F(in)     T(in)
  204. #define I_D(in)     T(in)
  205. #define I_X(in)     T(in)
  206. #define I_B(in)     T(in)
  207. #define I_P(in)     T(in)
  208. #define I_R(in)     T(in)
  209.  
  210. #define I_FT(in)    TP(in)
  211. #define I_O(in)     TP(in)
  212. #define I_CS(in)    TP(in)
  213.  
  214. #define I_CSS(in)   TPP(in)
  215.  
  216. #define I_CV(in,len)    TV(in, len)
  217. #define I_SV(in,len)    TV(in, len)
  218. #define I_IV(in,len)    TV(in, len)
  219. #define I_FV(in,len)    TV(in, len)
  220. #define I_DV(in,len)    TV(in, len)
  221. #define I_BV(in,len)    TV(in, len)
  222. #define I_PV(in,len)    TV(in, len)
  223. #define I_RV(in,len)    TV(in, len)
  224. #define I_XV(in,len)    TV(in, len)
  225.  
  226. #define I_CSV(in,len)   TVP(in, len)
  227. #define I_OV(in,len)    TVP(in, len)
  228.  
  229.  
  230. #define I_CA(in,len)    TA(in, len)
  231. #define I_SA(in,len)    TA(in, len)
  232. #define I_IA(in,len)    TA(in, len)
  233. #define I_FA(in,len)    TA(in, len)
  234. #define I_DA(in,len)    TA(in, len)
  235. #define I_BA(in,len)    TA(in, len)
  236. #define I_PA(in,len)    TA(in, len)
  237. #define I_RA(in,len)    TA(in, len)
  238. #define I_XA(in,len)    TA(in, len)
  239.  
  240. #define I_CSA(in,len)   TAP(in, len)
  241. #define I_OA(in,len)    TAP(in, len)
  242.  
  243. #endif Class_First
  244.